#pragma once
//连接池类（非单例版本），用于管理整个服务器的数据库连接(不管理数据库的默认/全局连接)

#include "msql_global.h"
#include "MSqlConnection.h"

#include <QQueue>
#include <QMutex>
#include <QMutexLocker>
#include <QSettings>		//配置文件
#include <QWaitCondition>

namespace NsMSql
{
	class MSqlDatabase;
}

namespace NsMSql
{
	class MSqlConnectionPool
	{
	public:
		MSqlConnectionPool(MSqlDatabase* sqlDatabase);
		~MSqlConnectionPool();
	public:
		//获取数据库连接
		MSqlConnection getConnection();
		//释放数据库连接回连接池
		void releaseConnection(MSqlConnection sqlConnection);
		//关闭连接池，删除所有的数据库连接，系统退出时调用
		void close();
	private:
		QString getConnectionName(const QString& databaseName, int index) { return QString("Connection_%1_%2").arg(databaseName).arg(index); }
	private:
		static QMutex m_mutex;
		static QWaitCondition m_waitConnection;

		MSqlServerAttr m_sqlServerAttr;
		int m_maxWaitTime;			// 获取连接最大等待时间
		int m_waitInterval;			// 尝试获取连接时等待间隔时间

		QQueue<QString> m_usedConnectionNames;					// 已使用的数据库连接
		QQueue<QString> m_unusedConnectionNames;				// 未使用的数据库连接
		QMap<QString, MSqlConnection> m_nameConnectionMap;		//<连接名，连接对象>
	};
}

